home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / term-source.lha / RatePanel.c < prev    next >
C/C++ Source or Header  |  1996-10-20  |  27KB  |  1,264 lines

  1. /*
  2. **    RatePanel.c
  3. **
  4. **    Editing panel for phone units configuration
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16. enum    {    GAD_TIME=1,GAD_ADDTIME,GAD_REMOVETIME,GAD_EDITTIME,
  17.             GAD_PAY1,GAD_MINUTES1,
  18.             GAD_PAY2,GAD_MINUTES2,
  19.             GAD_LIST,
  20.             GAD_ADDDATE,GAD_ADDDAY,GAD_EDIT,
  21.             GAD_CLONE,GAD_REMOVE,GAD_IMPORT
  22.         };
  23.  
  24. struct DoubleInfo
  25. {
  26.     LONG    GlyphWidth,
  27.             HeaderLen;
  28. };
  29.  
  30. STATIC VOID
  31. Rate2String(ULONG Rate,STRPTR String,LONG StringSize)
  32. {
  33.     if(Rate % 10000)
  34.     {
  35.         LONG i,Len;
  36.  
  37.         LimitedSPrintf(StringSize,String,"%ld%s%04ld",Rate / 10000,DecimalPoint,Rate % 10000);
  38.  
  39.         Len = strlen(String);
  40.  
  41.         for(i = Len - 1 ; i >= Len - 3 ; i--)
  42.         {
  43.             if(String[i] == '0')
  44.                 String[i] = 0;
  45.             else
  46.                 break;
  47.         }
  48.     }
  49.     else
  50.         LimitedSPrintf(StringSize,String,"%ld",Rate / 10000);
  51. }
  52.  
  53. STATIC ULONG
  54. String2Rate(STRPTR String)
  55. {
  56.     ULONG Lead;
  57.     ULONG Follow;
  58.     ULONG Factor;
  59.     BOOL Decimal;
  60.     LONG i;
  61.  
  62.     Lead = 0;
  63.     Follow = 0;
  64.     Factor = 1000;
  65.     Decimal = FALSE;
  66.  
  67.     for(i = 0 ; i < strlen(String) ; i++)
  68.     {
  69.         if(String[i] == DecimalPoint[0])
  70.             Decimal = TRUE;
  71.         else
  72.         {
  73.             ULONG v = String[i] & 0xf;
  74.  
  75.             if(Decimal)
  76.             {
  77.                 Follow += v * Factor;
  78.  
  79.                 Factor /= 10;
  80.             }
  81.             else
  82.                 Lead = (10 * Lead) + v;
  83.         }
  84.     }
  85.  
  86.     return(Lead * 10000 + Follow);
  87. }
  88.  
  89. STATIC ULONG SAVE_DS ASM
  90. RateEditRoutine(REG(a0) struct Hook *UnusedHook,REG(a2) struct SGWork *Work,REG(a1) Msg msg)
  91. {
  92.     switch(msg->MethodID)
  93.     {
  94.         case SGH_KEY:
  95.  
  96.             if(Work->EditOp == EO_INSERTCHAR || Work->EditOp == EO_REPLACECHAR)
  97.             {
  98.                 ULONG Integral;
  99.                 BOOL Decimal;
  100.                 WORD Follow;
  101.                 BOOL UseIt;
  102.                 UBYTE c;
  103.                 LONG i;
  104.  
  105.                 Integral    = 0;
  106.                 Decimal        = FALSE;
  107.                 Follow        = 0;
  108.                 UseIt        = TRUE;
  109.  
  110.                 for(i = 0 ; i < strlen(Work->WorkBuffer) ; i++)
  111.                 {
  112.                     c = Work->WorkBuffer[i];
  113.  
  114.                     if(c == '.')
  115.                         c = Work->WorkBuffer[i] = DecimalPoint[0];
  116.  
  117.                     if(c == DecimalPoint[0])
  118.                     {
  119.                         if(Decimal)
  120.                         {
  121.                             UseIt = FALSE;
  122.                             break;
  123.                         }
  124.                         else
  125.                             Decimal = TRUE;
  126.                     }
  127.                     else
  128.                     {
  129.                         if(c >= '0' && c <= '9')
  130.                         {
  131.                             if(Decimal)
  132.                                 Follow++;
  133.                             else
  134.                                 Integral = (Integral * 10) + (c & 0xf);
  135.                         }
  136.                         else
  137.                         {
  138.                             UseIt = FALSE;
  139.                             break;
  140.                         }
  141.                     }
  142.                 }
  143.  
  144.                 if(Follow > 4 || !UseIt || Integral > 429496)
  145.                 {
  146.                     Work->EditOp    = EO_BADFORMAT;
  147.                     Work->Actions    = SGA_BEEP;
  148.                 }
  149.             }
  150.  
  151.         /* Falls through to... */
  152.  
  153.         case SGH_CLICK:
  154.  
  155.             return(TRUE);
  156.  
  157.         default:
  158.  
  159.             return(FALSE);
  160.     }
  161. }
  162.  
  163.     /* RateListViewRender():
  164.      *
  165.      *    This callback routine is responsible for rendering
  166.      *    the single listview entries.
  167.      */
  168.  
  169. STATIC ULONG SAVE_DS ASM
  170. RateListViewRender(REG(a0) struct Hook *Hook,REG(a2) struct Node *Node,REG(a1) struct LVDrawMsg *Msg)
  171. {
  172.         /* We only know how to redraw lines. */
  173.  
  174.     if(Msg->lvdm_MethodID == LV_DRAW)
  175.     {
  176.         struct RastPort        *RPort    = Msg->lvdm_RastPort;
  177.         LONG                 Left    = Msg->lvdm_Bounds.MinX,
  178.                              Top    = Msg->lvdm_Bounds.MinY,
  179.                              Width    = Msg->lvdm_Bounds.MaxX - Msg->lvdm_Bounds.MinX + 1,
  180.                              Height    = Msg->lvdm_Bounds.MaxY - Msg->lvdm_Bounds.MinY + 1,
  181.                              Delta,
  182.                              FgPen,BgPen,
  183.                              Len,LabelLen,Template;
  184.         UBYTE                *String,Header[8];
  185.         struct DoubleInfo    *Info;
  186.         UWORD                *Pens;
  187.  
  188.         Pens = Msg->lvdm_DrawInfo->dri_Pens;
  189.  
  190.         Info = Hook->h_Data;
  191.  
  192.         String = &Node->ln_Name[Info->HeaderLen];
  193.  
  194.         CopyMem(Node->ln_Name,Header,Info->HeaderLen);
  195.  
  196.         Header[Info->HeaderLen] = 0;
  197.  
  198.             /* Determine the rendering pens. */
  199.  
  200.         if(Msg->lvdm_State == LVR_SELECTED)
  201.         {
  202.             FgPen = FILLTEXTPEN;
  203.             BgPen = FILLPEN;
  204.         }
  205.         else
  206.         {
  207.             FgPen = TEXTPEN;
  208.             BgPen = BACKGROUNDPEN;
  209.         }
  210.  
  211.         FgPen = Pens[FgPen];
  212.         BgPen = Pens[BgPen];
  213.  
  214.             /* Set the rendering pens. */
  215.  
  216.         SetABPenDrMd(RPort,BgPen,BgPen,JAM2);
  217.  
  218.         RectFill(RPort,Left,Top,Left + 1,Top + Height - 1);
  219.  
  220.         Left    += 2;
  221.         Width    -= 2;
  222.  
  223.         Template = Info->HeaderLen * Info->GlyphWidth;
  224.  
  225.             /* Determine header length. */
  226.  
  227.         Len = TextLength(RPort,Header,Info->HeaderLen);
  228.  
  229.             /* Fill the space to precede the header. */
  230.  
  231.         if((Delta = Template - Len) > 0)
  232.         {
  233.             SetAPen(RPort,BgPen);
  234.             FillBox(RPort,Left,Top,Delta,Height);
  235.         }
  236.  
  237.             /* Render the header, right-justified. */
  238.  
  239.         SetAPen(RPort,FgPen);
  240.  
  241.         PlaceText(RPort,Left + Delta,Top,Header,Info->HeaderLen);
  242.  
  243.             /* Adjust width and area left edge. */
  244.  
  245.         Left    += Template;
  246.         Width    -= Template;
  247.  
  248.             /* Determine length of vanilla name. */
  249.  
  250.         LabelLen = strlen(String);
  251.  
  252.             /* Try to make it fit. */
  253.  
  254.         LabelLen = FitText(RPort,Width,String,LabelLen);
  255.  
  256.             /* Print the vanilla name if possible. */
  257.  
  258.         if(LabelLen)
  259.         {
  260.             Len = TextLength(RPort,String,LabelLen);
  261.  
  262.             PlaceText(RPort,Left,Top,String,LabelLen);
  263.  
  264.             Left    += Len;
  265.             Width    -= Len;
  266.         }
  267.  
  268.             /* Fill the area to follow the vanilla name. */
  269.  
  270.         if(Width > 0)
  271.         {
  272.             SetAPen(RPort,BgPen);
  273.             FillBox(RPort,Left,Top,Width,Height);
  274.         }
  275.  
  276.             /* If the item happens to be disabled, draw the cross-hatch
  277.              * pattern across it.
  278.              */
  279.  
  280.         ListViewStateFill(Msg);
  281.  
  282.         return(LVCB_OK);
  283.     }
  284.     else
  285.         return(LVCB_UNKNOWN);
  286. }
  287.  
  288. STATIC VOID
  289. ChangeLocalState(LayoutHandle *Handle,struct List *TimeDateList,struct TimeDateNode *SelectedTimeDateNode,struct List *TimeList,LONG SelectedTime)
  290. {
  291.     BOOL IsDefaultEntry,IsInvalid,HasNoData,IsEmpty,IsSingle;
  292.     Tag StringTag;
  293.  
  294.     if(IsListEmpty(TimeDateList))
  295.         IsEmpty = IsDefaultEntry = IsInvalid = IsSingle = HasNoData = TRUE;
  296.     else
  297.     {
  298.         IsDefaultEntry    = (SelectedTimeDateNode == NULL) || (BOOL)(TimeDateList->lh_Head == (struct Node *)SelectedTimeDateNode);
  299.         IsEmpty            = FALSE;
  300.         IsInvalid        = FALSE;
  301.         HasNoData        = (BOOL)(SelectedTime < 0);
  302.  
  303.         if(TimeList)
  304.             IsSingle = (BOOL)(TimeList->lh_Head == TimeList->lh_TailPred);
  305.         else
  306.             IsSingle = TRUE;
  307.     }
  308.  
  309.     StringTag = (IsInvalid || HasNoData) ? GTST_String : TAG_IGNORE;
  310.  
  311.     LT_SetAttributes(Handle,GAD_PAY1,
  312.         GA_Disabled,    IsInvalid || HasNoData,
  313.         StringTag,        "",
  314.     TAG_DONE);
  315.  
  316.     LT_SetAttributes(Handle,GAD_MINUTES1,
  317.         GA_Disabled,    IsInvalid || HasNoData,
  318.         StringTag,        "",
  319.     TAG_DONE);
  320.  
  321.     LT_SetAttributes(Handle,GAD_PAY2,
  322.         GA_Disabled,    IsInvalid || HasNoData,
  323.         StringTag,        "",
  324.     TAG_DONE);
  325.  
  326.     LT_SetAttributes(Handle,GAD_MINUTES2,
  327.         GA_Disabled,    IsInvalid || HasNoData,
  328.         StringTag,        "",
  329.     TAG_DONE);
  330.  
  331.     LT_SetAttributes(Handle,GAD_EDIT,
  332.         GA_Disabled,    HasNoData || IsDefaultEntry,
  333.     TAG_DONE);
  334.  
  335.     LT_SetAttributes(Handle,GAD_CLONE,
  336.         GA_Disabled,    HasNoData || IsDefaultEntry,
  337.     TAG_DONE);
  338.  
  339.     LT_SetAttributes(Handle,GAD_REMOVE,
  340.         GA_Disabled,    HasNoData || IsDefaultEntry,
  341.     TAG_DONE);
  342.  
  343.     LT_SetAttributes(Handle,GAD_LIST,
  344.         GA_Disabled,    IsEmpty,
  345.     TAG_DONE);
  346.  
  347.     LT_SetAttributes(Handle,GAD_TIME,
  348.         GA_Disabled,    HasNoData || IsInvalid,
  349.     TAG_DONE);
  350.  
  351.     LT_SetAttributes(Handle,GAD_ADDTIME,
  352.         GA_Disabled,    IsInvalid,
  353.     TAG_DONE);
  354.  
  355.     LT_SetAttributes(Handle,GAD_REMOVETIME,
  356.         GA_Disabled,    HasNoData || IsInvalid || IsSingle,
  357.     TAG_DONE);
  358.  
  359.     LT_SetAttributes(Handle,GAD_EDITTIME,
  360.         GA_Disabled,    HasNoData || IsInvalid,
  361.     TAG_DONE);
  362. }
  363.  
  364. STATIC VOID
  365. ShowSelectedTime(LayoutHandle *Handle,struct TimeDateNode *SelectedTimeDateNode,LONG SelectedTime)
  366. {
  367.     UBYTE String[20];
  368.  
  369.     Rate2String(SelectedTimeDateNode->Table[SelectedTime].PayPerUnit[DT_FIRST_UNIT],String,sizeof(String));
  370.  
  371.     LT_SetAttributes(Handle,GAD_PAY1,
  372.         GTST_String,    String,
  373.     TAG_DONE);
  374.  
  375.     Rate2String(SelectedTimeDateNode->Table[SelectedTime].SecPerUnit[DT_FIRST_UNIT],String,sizeof(String));
  376.     LT_SetAttributes(Handle,GAD_MINUTES1,
  377.         GTST_String,    String,
  378.     TAG_DONE);
  379.  
  380.     Rate2String(SelectedTimeDateNode->Table[SelectedTime].PayPerUnit[DT_NEXT_UNIT],String,sizeof(String));
  381.  
  382.     LT_SetAttributes(Handle,GAD_PAY2,
  383.         GTST_String,    String,
  384.     TAG_DONE);
  385.  
  386.     Rate2String(SelectedTimeDateNode->Table[SelectedTime].SecPerUnit[DT_NEXT_UNIT],String,sizeof(String));
  387.  
  388.     LT_SetAttributes(Handle,GAD_MINUTES2,
  389.         GTST_String,    String,
  390.     TAG_DONE);
  391. }
  392.  
  393. BOOL
  394. RatePanel(struct Window *Parent,PhonebookHandle *PhoneHandle,PhoneEntry *Entry,struct List *TimeDateList)
  395. {
  396.     STATIC struct DoubleInfo TimeInfo;
  397.     STATIC struct DoubleInfo DateInfo;
  398.  
  399.     STATIC struct Hook TimeHook;
  400.     STATIC struct Hook DateHook;
  401.     STATIC struct Hook RateHook;
  402.  
  403.     struct LayoutHandle    *Handle;
  404.     BOOL                 MadeChanges = FALSE;
  405.  
  406.     InitHook(&TimeHook,(HOOKFUNC)RateListViewRender,&TimeInfo);
  407.     InitHook(&DateHook,(HOOKFUNC)RateListViewRender,&DateInfo);
  408.     InitHook(&RateHook,(HOOKFUNC)RateEditRoutine,NULL);
  409.  
  410.     if(!TimeDateList)
  411.         TimeDateList = (struct List *)&Entry->TimeDateList;
  412.  
  413.     if(Handle = LT_CreateHandleTags(Parent->WScreen,
  414.         LAHN_LocaleHook,    &LocaleHook,
  415.     TAG_DONE))
  416.     {
  417.         STATIC WORD ButtonLabels[] =
  418.         {
  419.             MSG_RATEPANEL_ADD_TIME_GAD,
  420.             MSG_RATEPANEL_REMOVE_TIME_GAD,
  421.             MSG_RATEPANEL_EDIT_TIME_GAD,
  422.  
  423.             MSG_RATEPANEL_ADD_DATE_GAD,
  424.             MSG_RATEPANEL_ADD_DAYS_GAD,
  425.             MSG_RATEPANEL_EDIT_GAD,
  426.  
  427.             MSG_RATEPANEL_CLONE_GAD,
  428.             MSG_GLOBAL_REMOVE_GAD,
  429.             MSG_RATEPANEL_IMPORT_GAD
  430.         };
  431.  
  432.         struct Window    *PanelWindow;
  433.         LONG             i,Max = 0,Size;
  434.         UBYTE             SmallString[2];
  435.         UBYTE             Currency[20];
  436.  
  437.         SmallCurrency(Currency,sizeof(Currency));
  438.  
  439.         SmallString[1] = 0;
  440.  
  441.         for(i = '0' ; i <= '9' ; i++)
  442.         {
  443.             SmallString[0] = i;
  444.  
  445.             if((Size = LT_LabelWidth(Handle,SmallString)) > Max)
  446.                 Max = Size;
  447.         }
  448.  
  449.         TimeInfo.GlyphWidth    = Max;
  450.         TimeInfo.HeaderLen    = 2;
  451.  
  452.         DateInfo.GlyphWidth    = Max;
  453.         DateInfo.HeaderLen    = 7;
  454.  
  455.         for(i = Max = 0 ; i < NUM_ELEMENTS(ButtonLabels) ; i++)
  456.         {
  457.             if((Size = LT_LabelChars(Handle,LocaleString(ButtonLabels[i]))) > Max)
  458.                 Max = Size;
  459.         }
  460.  
  461.         LT_New(Handle,
  462.             LA_Type,    VERTICAL_KIND,
  463.         TAG_DONE);
  464.         {
  465.             LT_New(Handle,
  466.                 LA_Type,    HORIZONTAL_KIND,
  467.                 LA_LabelID,    MSG_V36_0157,
  468.             TAG_DONE);
  469.             {
  470.                 LT_New(Handle,
  471.                     LA_Type,    HORIZONTAL_KIND,
  472.                 TAG_DONE);
  473.                 {
  474.                     LT_New(Handle,
  475.                         LA_Type,        LISTVIEW_KIND,
  476.                         LA_LabelID,        MSG_RATEPANEL_DAYS_AND_DATES_GAD,
  477.                         LA_Chars,        30,
  478.                         LA_ID,            GAD_LIST,
  479.                         LALV_Lines,        10,
  480.                         GTLV_CallBack,    &DateHook,
  481.                         GTLV_MaxPen,    GetListMaxPen(Handle->DrawInfo->dri_Pens),
  482.                         GTLV_Labels,    TimeDateList,
  483.                         LALV_Link,        NIL_LINK,
  484.  
  485.                         Kick30 ? TAG_IGNORE : LALV_TextAttr, ~0,
  486.                     TAG_DONE);
  487.  
  488.                     LT_New(Handle,
  489.                         LA_Type,        LISTVIEW_KIND,
  490.                         LA_LabelID,        MSG_RATEPANEL_TIME_GAD,
  491.                         LA_Chars,        10,
  492.                         LA_ID,            GAD_TIME,
  493.                         GA_Disabled,    TRUE,
  494.                         LALV_Lines,        10,
  495.                         GTLV_CallBack,    &TimeHook,
  496.                         GTLV_MaxPen,    GetListMaxPen(Handle->DrawInfo->dri_Pens),
  497.                         LALV_Link,        NIL_LINK,
  498.  
  499.                         Kick30 ? TAG_IGNORE : LALV_TextAttr, ~0,
  500.                     TAG_DONE);
  501.  
  502.                     LT_EndGroup(Handle);
  503.                 }
  504.  
  505.                 LT_New(Handle,
  506.                     LA_Type,    VERTICAL_KIND,
  507.                 TAG_DONE);
  508.                 {
  509.                     LT_New(Handle,
  510.                         LA_Type,        VERTICAL_KIND,
  511.                         LA_LabelID,        MSG_RATEPANEL_FIRST_UNIT_GAD,
  512.                         LAGR_SameSize,    TRUE,
  513.                     TAG_DONE);
  514.                     {
  515.                         LT_New(Handle,
  516.                             LA_Type,            STRING_KIND,
  517.                             LA_LabelText,        Currency,
  518.                             LA_ID,                GAD_PAY1,
  519.                             LA_Chars,            6,
  520.                             GTST_MaxChars,        11,
  521.                             GTST_EditHook,        &RateHook,
  522.                             GA_Disabled,        TRUE,
  523.                         TAG_DONE);
  524.  
  525.                         LT_New(Handle,
  526.                             LA_Type,            STRING_KIND,
  527.                             LA_LabelID,            MSG_RATEPANEL_SECONDS_PER_UNIT_GAD,
  528.                             LA_ID,                GAD_MINUTES1,
  529.                             GTST_MaxChars,        11,
  530.                             GTST_EditHook,        &RateHook,
  531.                             GA_Disabled,        TRUE,
  532.                         TAG_DONE);
  533.  
  534.                         LT_EndGroup(Handle);
  535.                     }
  536.  
  537.                     LT_New(Handle,
  538.                         LA_Type,        VERTICAL_KIND,
  539.                         LA_LabelID,        MSG_RATEPANEL_FOLLOWING_UNITS_GAD,
  540.                         LAGR_SameSize,    TRUE,
  541.                     TAG_DONE);
  542.                     {
  543.                         LT_New(Handle,
  544.                             LA_Type,            STRING_KIND,
  545.                             LA_LabelText,        Currency,
  546.                             LA_ID,                GAD_PAY2,
  547.                             GA_Disabled,        TRUE,
  548.                             GTST_MaxChars,        11,
  549.                             GTST_EditHook,        &RateHook,
  550.                         TAG_DONE);
  551.  
  552.                         LT_New(Handle,
  553.                             LA_Type,            STRING_KIND,
  554.                             LA_LabelID,            MSG_RATEPANEL_SECONDS_PER_UNIT_GAD,
  555.                             LA_ID,                GAD_MINUTES2,
  556.                             LA_Chars,            6,
  557.                             GTST_MaxChars,        11,
  558.                             GTST_EditHook,        &RateHook,
  559.                             GA_Disabled,        TRUE,
  560.                         TAG_DONE);
  561.  
  562.                         LT_EndGroup(Handle);
  563.                     }
  564.  
  565.                     LT_EndGroup(Handle);
  566.                 }
  567.  
  568.                 LT_EndGroup(Handle);
  569.             }
  570.  
  571.             LT_New(Handle,
  572.                 LA_Type,    VERTICAL_KIND,
  573.             TAG_DONE);
  574.             {
  575.                 LT_New(Handle,
  576.                     LA_Type,        XBAR_KIND,
  577.                     LAXB_FullSize,    TRUE,
  578.                 TAG_DONE);
  579.  
  580.                 LT_EndGroup(Handle);
  581.             }
  582.  
  583.             LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  584.                 LAGR_Spread,    TRUE,
  585.                 LAGR_SameSize,    TRUE,
  586.             TAG_DONE);
  587.             {
  588.                 LT_New(Handle,
  589.                     LA_Type,        BUTTON_KIND,
  590.                     LA_LabelID,        MSG_RATEPANEL_ADD_TIME_GAD,
  591.                     LA_ID,            GAD_ADDTIME,
  592.                     LA_Chars,        Max,
  593.                     GA_Disabled,    TRUE,
  594.                 TAG_DONE);
  595.  
  596.                 LT_New(Handle,
  597.                     LA_Type,        BUTTON_KIND,
  598.                     LA_LabelID,        MSG_RATEPANEL_REMOVE_TIME_GAD,
  599.                     LA_ID,            GAD_REMOVETIME,
  600.                     GA_Disabled,    TRUE,
  601.                 TAG_DONE);
  602.  
  603.                 LT_New(Handle,
  604.                     LA_Type,        BUTTON_KIND,
  605.                     LA_LabelID,        MSG_RATEPANEL_EDIT_TIME_GAD,
  606.                     LA_ID,            GAD_EDITTIME,
  607.                     GA_Disabled,    TRUE,
  608.                 TAG_DONE);
  609.  
  610.                 LT_EndGroup(Handle);
  611.             }
  612.  
  613.             LT_New(Handle,
  614.                 LA_Type,    VERTICAL_KIND,
  615.             TAG_DONE);
  616.             {
  617.                 LT_New(Handle,
  618.                     LA_Type,        XBAR_KIND,
  619.                 TAG_DONE);
  620.  
  621.                 LT_EndGroup(Handle);
  622.             }
  623.  
  624.             LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  625.                 LAGR_Spread,    TRUE,
  626.                 LAGR_SameSize,    TRUE,
  627.             TAG_DONE);
  628.             {
  629.                 LT_New(Handle,
  630.                     LA_Type,        BUTTON_KIND,
  631.                     LA_LabelID,        MSG_RATEPANEL_ADD_DATE_GAD,
  632.                     LA_ID,            GAD_ADDDATE,
  633.                     LA_Chars,        Max,
  634.                 TAG_DONE);
  635.  
  636.                 LT_New(Handle,
  637.                     LA_Type,        BUTTON_KIND,
  638.                     LA_LabelID,        MSG_RATEPANEL_ADD_DAYS_GAD,
  639.                     LA_ID,            GAD_ADDDAY,
  640.                 TAG_DONE);
  641.  
  642.                 LT_New(Handle,
  643.                     LA_Type,        BUTTON_KIND,
  644.                     LA_LabelID,        MSG_RATEPANEL_EDIT_GAD,
  645.                     LA_ID,            GAD_EDIT,
  646.                     GA_Disabled,    TRUE,
  647.                 TAG_DONE);
  648.  
  649.                 LT_EndGroup(Handle);
  650.             }
  651.  
  652.             LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  653.                 LAGR_Spread,    TRUE,
  654.                 LAGR_SameSize,    TRUE,
  655.             TAG_DONE);
  656.             {
  657.                 LT_New(Handle,
  658.                     LA_Type,        BUTTON_KIND,
  659.                     LA_LabelID,        MSG_RATEPANEL_CLONE_GAD,
  660.                     LA_ID,            GAD_CLONE,
  661.                     LA_Chars,        Max,
  662.                     GA_Disabled,    TRUE,
  663.                 TAG_DONE);
  664.  
  665.                 LT_New(Handle,
  666.                     LA_Type,        BUTTON_KIND,
  667.                     LA_LabelID,        MSG_GLOBAL_REMOVE_GAD,
  668.                     LA_ID,            GAD_REMOVE,
  669.                     GA_Disabled,    TRUE,
  670.                 TAG_DONE);
  671.  
  672.                 LT_New(Handle,
  673.                     LA_Type,        BUTTON_KIND,
  674.                     LA_LabelID,        MSG_RATEPANEL_IMPORT_GAD,
  675.                     LA_ID,            GAD_IMPORT,
  676.                     GA_Disabled,    GlobalPhoneHandle->NumPhoneEntries == 0,
  677.                 TAG_DONE);
  678.  
  679.                 LT_EndGroup(Handle);
  680.             }
  681.  
  682.             LT_EndGroup(Handle);
  683.         }
  684.  
  685.         if(PanelWindow = LT_Build(Handle,
  686.             LAWN_TitleID,        MSG_RATEPANEL_RATES_PREFERENCES_TXT,
  687.             LAWN_IDCMP,            IDCMP_CLOSEWINDOW,
  688.             LAWN_HelpHook,        &GuideHook,
  689.             LAWN_Parent,        Parent,
  690.             WA_DepthGadget,        TRUE,
  691.             WA_CloseGadget,        TRUE,
  692.             WA_DragBar,            TRUE,
  693.             WA_RMBTrap,            TRUE,
  694.             WA_Activate,        TRUE,
  695.             WA_SimpleRefresh,    TRUE,
  696.         TAG_DONE))
  697.         {
  698.             struct IntuiMessage    *Message;
  699.             BOOL                 Done = FALSE;
  700.             ULONG                 MsgClass;
  701.             UWORD                 MsgCode;
  702.             struct Gadget        *MsgGadget;
  703.             LONG                 MsgGadgetID;
  704.  
  705.             BOOL                 Redisplay;
  706.  
  707.             struct TimeDateNode    *SelectedTimeDateNode;
  708.             LONG                 SelectedTime;
  709.  
  710.             LONG                 TimeDateListSize;
  711.             struct List            *TimeList;
  712.  
  713.             struct TimeDateNode    *NewNode;
  714.  
  715.             GuideContext(CONTEXT_RATES);
  716.  
  717.             TimeDateListSize = GetListSize(TimeDateList);
  718.  
  719.             TimeList = NULL;
  720.  
  721.             SelectedTimeDateNode = NULL;
  722.             SelectedTime = -1;
  723.  
  724.             Redisplay = FALSE;
  725.  
  726.             PushWindow(PanelWindow);
  727.  
  728.             LT_ShowWindow(Handle,TRUE);
  729.  
  730.             do
  731.             {
  732.                 if(Wait(PORTMASK(PanelWindow->UserPort) | SIG_BREAK) & SIG_BREAK)
  733.                     break;
  734.  
  735.                 while(Message = (struct IntuiMessage *)LT_GetIMsg(Handle))
  736.                 {
  737.                     MsgClass    = Message->Class;
  738.                     MsgCode        = Message->Code;
  739.                     MsgGadget    = (struct Gadget *)Message->IAddress;
  740.  
  741.                     LT_ReplyIMsg(Message);
  742.  
  743.                     if(MsgClass == IDCMP_CLOSEWINDOW)
  744.                         Done = TRUE;
  745.  
  746.                     MsgGadgetID = -1;
  747.  
  748.                     if(MsgClass == IDCMP_GADGETUP)
  749.                         MsgGadgetID = MsgGadget->GadgetID;
  750.  
  751.                     if(MsgClass == IDCMP_IDCMPUPDATE)
  752.                     {
  753.                         switch(MsgGadget->GadgetID)
  754.                         {
  755.                             case GAD_LIST:
  756.  
  757.                                 if(SelectedTimeDateNode != NULL && TimeDateList->lh_Head != (struct Node *)SelectedTimeDateNode)
  758.                                     MsgGadgetID = GAD_EDIT;
  759.  
  760.                                 break;
  761.  
  762.                             case GAD_TIME:
  763.  
  764.                                 if(SelectedTimeDateNode != NULL && SelectedTime != -1)
  765.                                     MsgGadgetID = GAD_EDITTIME;
  766.  
  767.                                 break;
  768.                         }
  769.  
  770.                         if(MsgGadgetID != -1)
  771.                             LT_PressButton(Handle,MsgGadgetID);
  772.                     }
  773.  
  774.                     if(MsgGadgetID != -1)
  775.                     {
  776.                         switch(MsgGadgetID)
  777.                         {
  778.                             case GAD_TIME:
  779.  
  780.                                 if(SelectedTimeDateNode != NULL && TimeList != NULL)
  781.                                 {
  782.                                     SelectedTime = MsgCode;
  783.  
  784.                                     ShowSelectedTime(Handle,SelectedTimeDateNode,SelectedTime);
  785.  
  786.                                     ChangeLocalState(Handle,TimeDateList,SelectedTimeDateNode,TimeList,SelectedTime);
  787.                                 }
  788.  
  789.                                 break;
  790.  
  791.                             case GAD_EDITTIME:
  792.  
  793.                                 if(SelectedTimeDateNode != NULL && SelectedTime != -1)
  794.                                 {
  795.                                     LT_LockWindow(PanelWindow);
  796.  
  797.                                         /* Edit the time */
  798.  
  799.                                     if(TimePanel(PanelWindow,&SelectedTimeDateNode->Table[SelectedTime].Time))
  800.                                     {
  801.                                             /* Make a mark so we can find it later */
  802.  
  803.                                         SelectedTimeDateNode->Table[SelectedTime].Mark = TRUE;
  804.  
  805.                                             /* Sort the times in ascending order */
  806.  
  807.                                         SortTimeTable(SelectedTimeDateNode);
  808.  
  809.                                             /* Find the previously selected item */
  810.  
  811.                                         for(i = 0 ; i < SelectedTimeDateNode->Table[0].Count ; i++)
  812.                                         {
  813.                                             if(SelectedTimeDateNode->Table[i].Mark)
  814.                                             {
  815.                                                     /* Remove the mark */
  816.  
  817.                                                 SelectedTimeDateNode->Table[i].Mark = FALSE;
  818.  
  819.                                                 SelectedTime = i;
  820.                                                 break;
  821.                                             }
  822.                                         }
  823.  
  824.                                         Redisplay = TRUE;
  825.                                         MadeChanges = TRUE;
  826.                                     }
  827.  
  828.                                     LT_UnlockWindow(PanelWindow);
  829.  
  830.                                     LT_ShowWindow(Handle,TRUE);
  831.                                 }
  832.  
  833.                                 break;
  834.  
  835.                             case GAD_REMOVETIME:
  836.  
  837.                                 if(SelectedTimeDateNode != NULL && SelectedTime != -1)
  838.                                 {
  839.                                     LT_LockWindow(PanelWindow);
  840.  
  841.                                     LT_SetAttributes(Handle,GAD_TIME,
  842.                                         GTLV_Labels,    ~0,
  843.                                     TAG_DONE);
  844.  
  845.                                     if(DeleteTimeDateNode(SelectedTimeDateNode,SelectedTime))
  846.                                     {
  847.                                         if(SelectedTime == SelectedTimeDateNode->Table[0].Count)
  848.                                             SelectedTime--;
  849.  
  850.                                         Redisplay = TRUE;
  851.                                         MadeChanges = TRUE;
  852.                                     }
  853.                                     else
  854.                                     {
  855.                                         LT_SetAttributes(Handle,GAD_TIME,
  856.                                             GTLV_Labels,    TimeList,
  857.                                         TAG_DONE);
  858.  
  859.                                         DisplayBeep(PanelWindow->WScreen);
  860.                                     }
  861.  
  862.                                     LT_UnlockWindow(PanelWindow);
  863.                                 }
  864.  
  865.                                 break;
  866.  
  867.                             case GAD_ADDTIME:
  868.  
  869.                                 if(SelectedTimeDateNode != NULL)
  870.                                 {
  871.                                     UBYTE Time = DT_GET_TIME(12,0);
  872.  
  873.                                     LT_LockWindow(PanelWindow);
  874.  
  875.                                         /* Get the new time */
  876.  
  877.                                     if(TimePanel(PanelWindow,&Time))
  878.                                     {
  879.                                         BOOL AddIt = TRUE;
  880.  
  881.                                             /* Check if this moment already exists */
  882.  
  883.                                         for(i = 0 ; i < SelectedTimeDateNode->Table[0].Count ; i++)
  884.                                         {
  885.                                             if(Time == SelectedTimeDateNode->Table[i].Time)
  886.                                             {
  887.                                                 AddIt = FALSE;
  888.                                                 break;
  889.                                             }
  890.                                         }
  891.  
  892.                                             /* Don't add it if it's already in there */
  893.  
  894.                                         if(AddIt)
  895.                                         {
  896.                                             LT_SetAttributes(Handle,GAD_TIME,
  897.                                                 GTLV_Labels,    ~0,
  898.                                             TAG_DONE);
  899.  
  900.                                                 /* Make a mark so we can find this entry later */
  901.  
  902.                                             SelectedTimeDateNode->Table[SelectedTime].Mark = TRUE;
  903.  
  904.                                                 /* Add one new entry */
  905.  
  906.                                             if(ResizeTimeDateNode(SelectedTimeDateNode,SelectedTimeDateNode->Table[0].Count + 1,Time))
  907.                                             {
  908.                                                     /* Restore the proper order */
  909.  
  910.                                                 SortTimeTable(SelectedTimeDateNode);
  911.  
  912.                                                     /* Find the originally selected item */
  913.  
  914.                                                 for(i = 0 ; i < SelectedTimeDateNode->Table[0].Count ; i++)
  915.                                                 {
  916.                                                     if(SelectedTimeDateNode->Table[i].Mark)
  917.                                                     {
  918.                                                             /* Remove the mark. */
  919.  
  920.                                                         SelectedTimeDateNode->Table[i].Mark = FALSE;
  921.  
  922.                                                         SelectedTime = i;
  923.                                                         break;
  924.                                                     }
  925.                                                 }
  926.  
  927.                                                 MadeChanges = TRUE;
  928.                                                 Redisplay = TRUE;
  929.                                             }
  930.                                             else
  931.                                             {
  932.                                                     /* Remove the mark. */
  933.  
  934.                                                 SelectedTimeDateNode->Table[SelectedTime].Mark = FALSE;
  935.  
  936.                                                     /* Restore the list */
  937.  
  938.                                                 LT_SetAttributes(Handle,GAD_TIME,
  939.                                                     GTLV_Labels,    TimeList,
  940.                                                 TAG_DONE);
  941.  
  942.                                                 DisplayBeep(PanelWindow->WScreen);
  943.                                             }
  944.                                         }
  945.                                     }
  946.  
  947.                                     LT_UnlockWindow(PanelWindow);
  948.  
  949.                                     LT_ShowWindow(Handle,TRUE);
  950.                                 }
  951.  
  952.                                 break;
  953.  
  954.                             case GAD_PAY1:
  955.  
  956.                                 SelectedTimeDateNode->Table[SelectedTime].PayPerUnit[DT_FIRST_UNIT] = String2Rate(LT_GetString(Handle,MsgGadgetID));
  957.                                 MadeChanges = TRUE;
  958.  
  959.                                 break;
  960.  
  961.                             case GAD_PAY2:
  962.  
  963.                                 SelectedTimeDateNode->Table[SelectedTime].PayPerUnit[DT_NEXT_UNIT] = String2Rate(LT_GetString(Handle,MsgGadgetID));
  964.                                 MadeChanges = TRUE;
  965.  
  966.                                 break;
  967.  
  968.                             case GAD_MINUTES1:
  969.  
  970.                                 SelectedTimeDateNode->Table[SelectedTime].SecPerUnit[DT_FIRST_UNIT] = String2Rate(LT_GetString(Handle,MsgGadgetID));
  971.                                 MadeChanges = TRUE;
  972.  
  973.                                 break;
  974.  
  975.                             case GAD_MINUTES2:
  976.  
  977.                                 SelectedTimeDateNode->Table[SelectedTime].SecPerUnit[DT_NEXT_UNIT] = String2Rate(LT_GetString(Handle,MsgGadgetID));
  978.                                 MadeChanges = TRUE;
  979.  
  980.                                 break;
  981.  
  982.                             case GAD_LIST:
  983.  
  984.                                 SelectedTimeDateNode = (struct TimeDateNode *)GetListNode(MsgCode,(struct List *)TimeDateList);
  985.                                 SelectedTime = 0;
  986.  
  987.                                 Redisplay = TRUE;
  988.  
  989.                                 break;
  990.  
  991.                             case GAD_IMPORT:
  992.  
  993.                                 LT_LockWindow(PanelWindow);
  994.  
  995.                                 LT_SetAttributes(Handle,GAD_LIST,
  996.                                     GTLV_Labels,    ~0,
  997.                                 TAG_DONE);
  998.  
  999.                                 if(ImportPanel(PanelWindow,PhoneHandle,Entry,TimeDateList))
  1000.                                 {
  1001.                                     if(SelectedTimeDateNode)
  1002.                                     {
  1003.                                         LONG Offset;
  1004.  
  1005.                                         Offset = GetNodeOffset((struct Node *)SelectedTimeDateNode,TimeDateList);
  1006.  
  1007.                                         if(Offset < 0)
  1008.                                             SelectedTimeDateNode = NULL;
  1009.                                         else
  1010.                                         {
  1011.                                             LT_SetAttributes(Handle,GAD_LIST,
  1012.                                                 GTLV_Labels,    TimeDateList,
  1013.                                                 LALV_Selected,    Offset,
  1014.                                             TAG_DONE);
  1015.  
  1016.                                             Redisplay = TRUE;
  1017.                                         }
  1018.                                     }
  1019.  
  1020.                                     if(SelectedTimeDateNode == NULL)
  1021.                                     {
  1022.                                         LT_SetAttributes(Handle,GAD_LIST,
  1023.                                             GTLV_Labels,    TimeDateList,
  1024.                                             LALV_Selected,    ~0,
  1025.                                         TAG_DONE);
  1026.  
  1027.                                         SelectedTimeDateNode = NULL;
  1028.  
  1029.                                         LT_SetAttributes(Handle,GAD_TIME,
  1030.                                             GTLV_Labels,    TimeList,
  1031.                                             LALV_Selected,    ~0,
  1032.                                         TAG_DONE);
  1033.  
  1034.                                         SelectedTime = -1;
  1035.                                     }
  1036.  
  1037.                                     MadeChanges = TRUE;
  1038.                                 }
  1039.                                 else
  1040.                                 {
  1041.                                     LT_SetAttributes(Handle,GAD_LIST,
  1042.                                         GTLV_Labels,    TimeDateList,
  1043.                                     TAG_DONE);
  1044.                                 }
  1045.  
  1046.                                 if(!Redisplay)
  1047.                                     ChangeLocalState(Handle,TimeDateList,SelectedTimeDateNode,TimeList,SelectedTime);
  1048.  
  1049.                                 LT_UnlockWindow(PanelWindow);
  1050.  
  1051.                                 LT_ShowWindow(Handle,TRUE);
  1052.  
  1053.                                 break;
  1054.  
  1055.                             case GAD_ADDDAY:
  1056.                             case GAD_ADDDATE:
  1057.  
  1058.                                 LT_LockWindow(PanelWindow);
  1059.  
  1060.                                 if(NewNode = CreateTimeDateNode(0,1,"",1))
  1061.                                 {
  1062.                                     BOOL Result;
  1063.  
  1064.                                     if(MsgGadgetID == GAD_ADDDAY)
  1065.                                     {
  1066.                                         NewNode->Header.Month    = -1;
  1067.                                         NewNode->Header.Day        = 0;
  1068.  
  1069.                                         Result = DayPanel(PanelWindow,NewNode);
  1070.                                     }
  1071.                                     else
  1072.                                         Result = DatePanel(PanelWindow,NewNode);
  1073.  
  1074.                                     if(Result)
  1075.                                     {
  1076.                                         MadeChanges = TRUE;
  1077.  
  1078.                                         AdaptTimeDateNode(NewNode);
  1079.  
  1080.                                         LT_SetAttributes(Handle,GAD_LIST,
  1081.                                             GTLV_Labels,    ~0,
  1082.                                         TAG_DONE);
  1083.  
  1084.                                         AddTail((struct List *)TimeDateList,&NewNode->Node);
  1085.  
  1086.                                         LT_SetAttributes(Handle,GAD_LIST,
  1087.                                             GTLV_Labels,        TimeDateList,
  1088.                                             LALV_Selected,        TimeDateListSize++,
  1089.                                         TAG_DONE);
  1090.  
  1091.                                         SelectedTimeDateNode = NewNode;
  1092.                                         SelectedTime = -1;
  1093.  
  1094.                                         Redisplay = TRUE;
  1095.                                     }
  1096.                                     else
  1097.                                         FreeVecPooled(NewNode);
  1098.                                 }
  1099.  
  1100.                                 if(!Redisplay)
  1101.                                     ChangeLocalState(Handle,TimeDateList,SelectedTimeDateNode,TimeList,SelectedTime);
  1102.  
  1103.                                 LT_UnlockWindow(PanelWindow);
  1104.  
  1105.                                 LT_ShowWindow(Handle,TRUE);
  1106.  
  1107.                                 break;
  1108.  
  1109.                             case GAD_REMOVE:
  1110.  
  1111.                                 LT_SetAttributes(Handle,GAD_LIST,
  1112.                                     GTLV_Labels,    ~0,
  1113.                                 TAG_DONE);
  1114.  
  1115.                                 NewNode = (struct TimeDateNode *)RemoveGetNext((struct Node *)SelectedTimeDateNode);
  1116.                                 FreeVecPooled(SelectedTimeDateNode);
  1117.  
  1118.                                 MadeChanges = TRUE;
  1119.  
  1120.                                 SelectedTimeDateNode = NewNode;
  1121.                                 TimeDateListSize--;
  1122.  
  1123.                                 SelectedTime = -1;
  1124.  
  1125.                                 if(NewNode)
  1126.                                 {
  1127.                                     LT_SetAttributes(Handle,GAD_LIST,
  1128.                                         GTLV_Labels,    TimeDateList,
  1129.                                         LALV_Selected,    GetNodeOffset((struct Node *)NewNode,TimeDateList),
  1130.                                     TAG_DONE);
  1131.  
  1132.                                     Redisplay = TRUE;
  1133.                                 }
  1134.                                 else
  1135.                                 {
  1136.                                     LT_SetAttributes(Handle,GAD_LIST,
  1137.                                         GTLV_Labels,    TimeDateList,
  1138.                                         LALV_Selected,    ~0,
  1139.                                     TAG_DONE);
  1140.  
  1141.                                     ChangeLocalState(Handle,TimeDateList,SelectedTimeDateNode,TimeList,SelectedTime);
  1142.                                 }
  1143.  
  1144.                                 break;
  1145.  
  1146.                             case GAD_CLONE:
  1147.  
  1148.                                 if(NewNode = CreateTimeDateNode(0,1,"",SelectedTimeDateNode->Table[0].Count))
  1149.                                 {
  1150.                                     MadeChanges = TRUE;
  1151.  
  1152.                                     strcpy(NewNode->Node.ln_Name = NewNode->Buffer,SelectedTimeDateNode->Buffer);
  1153.  
  1154.                                     NewNode->Header = SelectedTimeDateNode->Header;
  1155.  
  1156.                                     CopyMem(SelectedTimeDateNode->Table,NewNode->Table,sizeof(struct TimeDate) * SelectedTimeDateNode->Table[0].Count);
  1157.  
  1158.                                     AdaptTimeDateNode(NewNode);
  1159.  
  1160.                                     LT_SetAttributes(Handle,GAD_LIST,
  1161.                                         GTLV_Labels,    ~0,
  1162.                                     TAG_DONE);
  1163.  
  1164.                                     AddTail((struct List *)TimeDateList,(struct Node *)NewNode);
  1165.  
  1166.                                     LT_SetAttributes(Handle,GAD_LIST,
  1167.                                         GTLV_Labels,    TimeDateList,
  1168.                                         LALV_Selected,    TimeDateListSize++,
  1169.                                     TAG_DONE);
  1170.  
  1171.                                     SelectedTimeDateNode = NewNode;
  1172.  
  1173.                                     ChangeLocalState(Handle,TimeDateList,SelectedTimeDateNode,TimeList,SelectedTime);
  1174.                                 }
  1175.  
  1176.                                 break;
  1177.  
  1178.                             case GAD_EDIT:
  1179.  
  1180.                                 LT_LockWindow(PanelWindow);
  1181.  
  1182.                                 LT_SetAttributes(Handle,GAD_LIST,
  1183.                                     GTLV_Labels,    ~0,
  1184.                                 TAG_DONE);
  1185.  
  1186.                                 if(SelectedTimeDateNode->Header.Month == -1)
  1187.                                     MadeChanges |= DayPanel(PanelWindow,SelectedTimeDateNode);
  1188.                                 else
  1189.                                     MadeChanges |= DatePanel(PanelWindow,SelectedTimeDateNode);
  1190.  
  1191.                                 AdaptTimeDateNode(SelectedTimeDateNode);
  1192.  
  1193.                                 LT_SetAttributes(Handle,GAD_LIST,
  1194.                                     GTLV_Labels,    TimeDateList,
  1195.                                 TAG_DONE);
  1196.  
  1197.                                 LT_UnlockWindow(PanelWindow);
  1198.  
  1199.                                 LT_ShowWindow(Handle,TRUE);
  1200.  
  1201.                                 break;
  1202.                         }
  1203.                     }
  1204.  
  1205.                     if(Redisplay)
  1206.                     {
  1207.                         Redisplay = FALSE;
  1208.  
  1209.                         if(SelectedTimeDateNode)
  1210.                         {
  1211.                             LT_SetAttributes(Handle,GAD_TIME,
  1212.                                 GTLV_Labels,~0,
  1213.                             TAG_DONE);
  1214.  
  1215.                             FreeVecPooled(TimeList);
  1216.  
  1217.                             if(TimeList = BuildTimeList(SelectedTimeDateNode))
  1218.                             {
  1219.                                 if(SelectedTime < 0)
  1220.                                     SelectedTime = 0;
  1221.  
  1222.                                 LT_SetAttributes(Handle,GAD_TIME,
  1223.                                     GTLV_Labels,    TimeList,
  1224.                                     LALV_Selected,    SelectedTime,
  1225.                                 TAG_DONE);
  1226.  
  1227.                                 ShowSelectedTime(Handle,SelectedTimeDateNode,SelectedTime);
  1228.                             }
  1229.                             else
  1230.                             {
  1231.                                 LT_SetAttributes(Handle,GAD_LIST,
  1232.                                     LALV_Selected,    ~0,
  1233.                                 TAG_DONE);
  1234.  
  1235.                                 SelectedTimeDateNode = NULL;
  1236.  
  1237.                                 LT_SetAttributes(Handle,GAD_TIME,
  1238.                                     GTLV_Labels,    NULL,
  1239.                                     LALV_Selected,    ~0,
  1240.                                 TAG_DONE);
  1241.  
  1242.                                 SelectedTime = -1;
  1243.  
  1244.                                 DisplayBeep(PanelWindow->WScreen);
  1245.                             }
  1246.                         }
  1247.  
  1248.                         ChangeLocalState(Handle,TimeDateList,SelectedTimeDateNode,TimeList,SelectedTime);
  1249.                     }
  1250.                 }
  1251.             }
  1252.             while(!Done);
  1253.  
  1254.             PopWindow();
  1255.  
  1256.             FreeVecPooled(TimeList);
  1257.         }
  1258.  
  1259.         LT_DeleteHandle(Handle);
  1260.     }
  1261.  
  1262.     return(MadeChanges);
  1263. }
  1264.